{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import wfdb as wf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from biosppy.signals import ecg\n",
    "import glob\n",
    "from scipy import signal\n",
    "import pandas as pd\n",
    "from keras.layers import Dense, Convolution1D, MaxPool1D, Flatten, Dropout\n",
    "from keras.layers import Input\n",
    "from keras.models import Model\n",
    "from keras.layers.normalization import BatchNormalization\n",
    "import keras\n",
    "from keras.callbacks import EarlyStopping, ModelCheckpoint\n",
    "from keras.utils.np_utils import to_categorical\n",
    "import tensorflow as tf\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [],
   "source": [
    "filepaths_glob=glob.iglob('/Users/aring/jupyter/differential-privacy/data/Arno/ECGDataDenoised/*.csv')\n",
    "filepaths=[]\n",
    "count=0\n",
    "for filepath in filepaths_glob:\n",
    "    filepaths.append(filepath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "no data for this patinet: 689\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "no data for this patinet: 7706\n",
      "no data for this patinet: 8271\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "no data for this patinet: 8666\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "no data for this patinet: 9001\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "no data for this patinet: 10227\n",
      "Failed to upload to ftp: Not enough beats to compute heart rate.\n",
      "Generating  /Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/lead1.csv\n"
     ]
    }
   ],
   "source": [
    "# Loop through each input file. Each file contains one\n",
    "# record of ECG readings, sampled at 500 readings per\n",
    "# second. Find the peaks and downsamples each beat and make it 186 points\n",
    "\n",
    "TARGET_SAMPLING_RATE=125\n",
    "DATA_SAMPLING_RATE=500\n",
    "INPUT_BEAT_SIZE=187\n",
    "patient_id=0\n",
    "savedata = np.empty((0,INPUT_BEAT_SIZE+1), dtype=np.float)\n",
    "\n",
    "for path in filepaths:\n",
    "#     print('patient_id: '+str(patient_id))\n",
    "    record=pd.read_csv(path,header=None)\n",
    "    channel = record[1].values\n",
    "    \n",
    "    try:\n",
    "        out = ecg.ecg(signal=channel, sampling_rate=DATA_SAMPLING_RATE, show=False)\n",
    "    except Exception as e: # work on python 3.x\n",
    "        print('Failed to upload to ftp: '+ str(e))\n",
    "        continue\n",
    "    \n",
    "    beatstoremove = np.array([0])\n",
    "    beats = np.split(channel, out['rpeaks'])\n",
    "    for idx, idxval in enumerate(out['rpeaks']):\n",
    "        firstround = idx == 0\n",
    "        lastround = idx == len(beats) - 1\n",
    "        # Skip first and last beat.\n",
    "        if (firstround or lastround):\n",
    "            continue\n",
    "\n",
    "        # Normalize the readings to a 0-1 range for ML purposes.\n",
    "        beats[idx] = (beats[idx] - beats[idx].min()) / beats[idx].ptp()\n",
    "\n",
    "        # Resample from 500HZ to 125Hz\n",
    "        newsize = int((beats[idx].size * TARGET_SAMPLING_RATE / DATA_SAMPLING_RATE) + 0.5)\n",
    "        beats[idx] = signal.resample(beats[idx], newsize)\n",
    "\n",
    "        #Skipping records that are too long.\n",
    "        if (beats[idx].size > INPUT_BEAT_SIZE):\n",
    "            beatstoremove = np.append(beatstoremove, idx)\n",
    "            continue\n",
    "\n",
    "        #Pad with zeroes.\n",
    "        zerocount = INPUT_BEAT_SIZE - beats[idx].size\n",
    "        beats[idx] = np.pad(beats[idx], (0, zerocount), 'constant', constant_values=(0.0, 0.0))\n",
    "\n",
    "        # Append the person ID to the beat data.\n",
    "        beats[idx] = np.append(beats[idx], float(patient_id))\n",
    "            \n",
    "    beatstoremove = np.append(beatstoremove, len(beats)-1)\n",
    "    beats = np.delete(beats, beatstoremove)\n",
    "    if ( np.array(list(beats[:])).ndim==2 ):\n",
    "        savedata = np.append(savedata, np.array(list(beats[:]), dtype=np.float), axis=0)\n",
    "    else:\n",
    "        print('no data for this patinet: '+ str(patient_id))\n",
    "        continue\n",
    "    \n",
    "    patient_id=patient_id+1\n",
    "\n",
    "\n",
    "# Save to CSV file.\n",
    "outfn = '/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/lead1.csv'\n",
    "print('Generating ', outfn)\n",
    "with open(outfn, \"wb\") as fin:\n",
    "    np.savetxt(fin, savedata, delimiter=\",\", fmt='%f')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [],
   "source": [
    "alldata_v1=np.loadtxt('/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/lead1.csv', delimiter=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "128170"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totrows=alldata_v1.shape[0]\n",
    "totrows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total rows128170\n",
      "training rows89719\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Randomly mix rows\n",
    "np.random.seed(897)\n",
    "np.random.shuffle(alldata_v1)\n",
    "\n",
    "\n",
    "trainrows_count = int((totrows * 7/ 10) + 0.5) # 70% for training\n",
    "print('total rows'+str(totrows))\n",
    "print('training rows'+str(trainrows_count))\n",
    "\n",
    "\n",
    "with open('/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input//train.csv', \"wb\") as fin:\n",
    "    np.savetxt(fin, alldata_v1[:trainrows_count], delimiter=\",\", fmt='%f')\n",
    "with open('/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/test.csv', \"wb\") as fin:\n",
    "    np.savetxt(fin, alldata_v1[trainrows_count:], delimiter=\",\", fmt='%f')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Training dataset.\n",
    "\n",
    "train_df = pd.read_csv(\"/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/train.csv\", header=None)\n",
    "X_train=train_df.iloc[:,:186].values\n",
    "train_df[187]=train_df[187].astype(int)\n",
    "target_train=train_df[187]\n",
    "y_train=to_categorical(target_train)\n",
    "X_train = X_train.reshape(len(X_train), X_train.shape[1],1)\n",
    "\n",
    "#test dataset\n",
    "test_df = pd.read_csv(\"/Users/aring/jupyter/differential-privacy/data/Arno/ECG-identification-input/test.csv\", header=None)\n",
    "X_test=test_df.iloc[:,:186].values\n",
    "test_df[187]=test_df[187].astype(int)\n",
    "target_test=test_df[187]\n",
    "y_test=to_categorical(target_test)\n",
    "X_test= X_test.reshape(len(X_test), X_test.shape[1],1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(89719, 10600)"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6516     15\n",
       "7827     14\n",
       "6633     14\n",
       "8060     14\n",
       "10093    14\n",
       "         ..\n",
       "5508      1\n",
       "3463      1\n",
       "1446      1\n",
       "7621      1\n",
       "4023      1\n",
       "Name: 187, Length: 10226, dtype: int64"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df[187].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10600"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_of_people_in_data =len(set(test_df[187]).union(set(train_df[187])))\n",
    "num_of_people_in_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [],
   "source": [
    "def network(X_train,y_train,X_test,y_test):\n",
    "    im_shape=(X_train.shape[1],1)\n",
    "    inputs_cnn=Input(shape=(im_shape), name='inputs_cnn')\n",
    "    conv1_1=Convolution1D(64, (6), activation='relu', input_shape=im_shape)(inputs_cnn)\n",
    "    conv1_1=BatchNormalization()(conv1_1)\n",
    "    pool1=MaxPool1D(pool_size=(3), strides=(2), padding=\"same\")(conv1_1)\n",
    "    conv2_1=Convolution1D(64, (3), activation='relu', input_shape=im_shape)(pool1)\n",
    "    conv2_1=BatchNormalization()(conv2_1)\n",
    "    pool2=MaxPool1D(pool_size=(2), strides=(2), padding=\"same\")(conv2_1)\n",
    "    conv3_1=Convolution1D(64, (3), activation='relu', input_shape=im_shape)(pool2)\n",
    "    conv3_1=BatchNormalization()(conv3_1)\n",
    "    pool3=MaxPool1D(pool_size=(2), strides=(2), padding=\"same\")(conv3_1)\n",
    "    flatten=Flatten()(pool3)\n",
    "    dense_end1 = Dense(64, activation='relu')(flatten)\n",
    "    dense_end2 = Dense(50, activation='relu')(dense_end1)\n",
    "    main_output = Dense(num_of_people_in_data, activation='softmax', name='main_output')(dense_end2)\n",
    "    \n",
    "    \n",
    "    model = Model(inputs= inputs_cnn, outputs=main_output)\n",
    "    model.compile(optimizer='adam', loss='categorical_crossentropy',metrics = ['accuracy'])\n",
    "    \n",
    "    \n",
    "    callbacks = [EarlyStopping(monitor='val_loss', patience=8),\n",
    "             ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]\n",
    "\n",
    "    history=model.fit(X_train, y_train,epochs=40,callbacks=callbacks, batch_size=32,validation_data=(X_test,y_test))\n",
    "    model.load_weights('best_model.h5')\n",
    "    return(model,history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model(history,X_test,y_test,model):\n",
    "    scores = model.evaluate((X_test),y_test, verbose=0)\n",
    "    print(\"Accuracy: %.2f%%\" % (scores[1]*100))\n",
    "    \n",
    "    print(history)\n",
    "    fig1, ax_acc = plt.subplots()\n",
    "    plt.plot(history.history['acc'])\n",
    "    plt.plot(history.history['val_acc'])\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.ylabel('Accuracy')\n",
    "    plt.title('Model - Accuracy')\n",
    "    plt.legend(['Training', 'Validation'], loc='lower right')\n",
    "    plt.show()\n",
    "    \n",
    "    fig2, ax_loss = plt.subplots()\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.ylabel('Loss')\n",
    "    plt.title('Model- Loss')\n",
    "    plt.legend(['Training', 'Validation'], loc='upper right')\n",
    "    plt.plot(history.history['loss'])\n",
    "    plt.plot(history.history['val_loss'])\n",
    "    plt.show()\n",
    "    \n",
    "    y_true=[]\n",
    "    for element in y_test:\n",
    "        y_true.append(np.argmax(element))\n",
    "    prediction_proba=model.predict(X_test)\n",
    "    prediction=np.argmax(prediction_proba,axis=1)\n",
    "    cnf_matrix = confusion_matrix(y_true, prediction)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 89719 samples, validate on 38451 samples\n",
      "Epoch 1/40\n",
      "89719/89719 [==============================] - 113s 1ms/step - loss: 7.7842 - acc: 0.0169 - val_loss: 6.5043 - val_acc: 0.0442\n",
      "Epoch 2/40\n",
      "89719/89719 [==============================] - 110s 1ms/step - loss: 5.2252 - acc: 0.1225 - val_loss: 5.0908 - val_acc: 0.1633\n",
      "Epoch 3/40\n",
      "89719/89719 [==============================] - 119s 1ms/step - loss: 3.9435 - acc: 0.2518 - val_loss: 4.3574 - val_acc: 0.2526\n",
      "Epoch 4/40\n",
      "89719/89719 [==============================] - 117s 1ms/step - loss: 3.1751 - acc: 0.3549 - val_loss: 3.7327 - val_acc: 0.3543\n",
      "Epoch 5/40\n",
      "89719/89719 [==============================] - 502s 6ms/step - loss: 2.6881 - acc: 0.4268 - val_loss: 3.4657 - val_acc: 0.3913\n",
      "Epoch 6/40\n",
      "89719/89719 [==============================] - 124s 1ms/step - loss: 2.3332 - acc: 0.4853 - val_loss: 3.1861 - val_acc: 0.4398\n",
      "Epoch 7/40\n",
      "89719/89719 [==============================] - 113s 1ms/step - loss: 2.0662 - acc: 0.5329 - val_loss: 2.9734 - val_acc: 0.4731\n",
      "Epoch 8/40\n",
      "89719/89719 [==============================] - 114s 1ms/step - loss: 1.8440 - acc: 0.5722 - val_loss: 2.8174 - val_acc: 0.5078\n",
      "Epoch 9/40\n",
      "89719/89719 [==============================] - 3758s 42ms/step - loss: 1.6634 - acc: 0.6080 - val_loss: 2.7685 - val_acc: 0.5062\n",
      "Epoch 10/40\n",
      "89719/89719 [==============================] - 132s 1ms/step - loss: 1.5136 - acc: 0.6387 - val_loss: 2.6947 - val_acc: 0.5356\n",
      "Epoch 11/40\n",
      "89719/89719 [==============================] - 112s 1ms/step - loss: 1.3759 - acc: 0.6649 - val_loss: 2.5222 - val_acc: 0.5665\n",
      "Epoch 12/40\n",
      "89719/89719 [==============================] - 100s 1ms/step - loss: 1.2642 - acc: 0.6885 - val_loss: 2.5100 - val_acc: 0.5603\n",
      "Epoch 13/40\n",
      "89719/89719 [==============================] - 103s 1ms/step - loss: 1.1670 - acc: 0.7090 - val_loss: 2.4612 - val_acc: 0.5797\n",
      "Epoch 14/40\n",
      "89719/89719 [==============================] - 103s 1ms/step - loss: 1.0778 - acc: 0.7301 - val_loss: 2.3404 - val_acc: 0.6127\n",
      "Epoch 15/40\n",
      "89719/89719 [==============================] - 97s 1ms/step - loss: 1.0013 - acc: 0.7459 - val_loss: 2.4559 - val_acc: 0.5866\n",
      "Epoch 16/40\n",
      "89719/89719 [==============================] - 101s 1ms/step - loss: 0.9322 - acc: 0.7602 - val_loss: 2.4469 - val_acc: 0.6002\n",
      "Epoch 17/40\n",
      "89719/89719 [==============================] - 100s 1ms/step - loss: 0.8696 - acc: 0.7743 - val_loss: 2.2917 - val_acc: 0.6259\n",
      "Epoch 18/40\n",
      "89719/89719 [==============================] - 99s 1ms/step - loss: 0.8115 - acc: 0.7884 - val_loss: 2.2539 - val_acc: 0.6357\n",
      "Epoch 19/40\n",
      "89719/89719 [==============================] - 969s 11ms/step - loss: 0.7627 - acc: 0.7990 - val_loss: 2.3006 - val_acc: 0.6240\n",
      "Epoch 20/40\n",
      "89719/89719 [==============================] - 144s 2ms/step - loss: 0.7162 - acc: 0.8111 - val_loss: 2.1979 - val_acc: 0.6584\n",
      "Epoch 21/40\n",
      "89719/89719 [==============================] - 127s 1ms/step - loss: 0.6766 - acc: 0.8196 - val_loss: 2.2503 - val_acc: 0.6416\n",
      "Epoch 22/40\n",
      "89719/89719 [==============================] - 121s 1ms/step - loss: 0.6371 - acc: 0.8290 - val_loss: 2.3280 - val_acc: 0.6443\n",
      "Epoch 23/40\n",
      "89719/89719 [==============================] - 134s 1ms/step - loss: 0.6036 - acc: 0.8356 - val_loss: 2.2755 - val_acc: 0.6476\n",
      "Epoch 24/40\n",
      "89719/89719 [==============================] - 134s 1ms/step - loss: 0.5711 - acc: 0.8439 - val_loss: 2.1353 - val_acc: 0.6765\n",
      "Epoch 25/40\n",
      "89719/89719 [==============================] - 140s 2ms/step - loss: 0.5430 - acc: 0.8518 - val_loss: 2.2040 - val_acc: 0.6732\n",
      "Epoch 26/40\n",
      "89719/89719 [==============================] - 124s 1ms/step - loss: 0.5167 - acc: 0.8589 - val_loss: 2.1820 - val_acc: 0.6814\n",
      "Epoch 27/40\n",
      "89719/89719 [==============================] - 106s 1ms/step - loss: 0.4888 - acc: 0.8657 - val_loss: 2.1841 - val_acc: 0.6736\n",
      "Epoch 28/40\n",
      "89719/89719 [==============================] - 109s 1ms/step - loss: 0.4624 - acc: 0.8712 - val_loss: 2.3729 - val_acc: 0.6409\n",
      "Epoch 29/40\n",
      "89719/89719 [==============================] - 98s 1ms/step - loss: 0.4475 - acc: 0.8762 - val_loss: 2.1394 - val_acc: 0.6948\n",
      "Epoch 30/40\n",
      "89719/89719 [==============================] - 1246s 14ms/step - loss: 0.4271 - acc: 0.8814 - val_loss: 2.1321 - val_acc: 0.6927\n",
      "Epoch 31/40\n",
      "89719/89719 [==============================] - 123s 1ms/step - loss: 0.4078 - acc: 0.8860 - val_loss: 2.3428 - val_acc: 0.6647\n",
      "Epoch 32/40\n",
      "89719/89719 [==============================] - 112s 1ms/step - loss: 0.3900 - acc: 0.8916 - val_loss: 2.2735 - val_acc: 0.6861\n",
      "Epoch 33/40\n",
      "89719/89719 [==============================] - 107s 1ms/step - loss: 0.3719 - acc: 0.8959 - val_loss: 2.2119 - val_acc: 0.6975\n",
      "Epoch 34/40\n",
      "89719/89719 [==============================] - 111s 1ms/step - loss: 0.3615 - acc: 0.8985 - val_loss: 2.3212 - val_acc: 0.6718\n",
      "Epoch 35/40\n",
      "89719/89719 [==============================] - 108s 1ms/step - loss: 0.3481 - acc: 0.9015 - val_loss: 2.2830 - val_acc: 0.6990\n",
      "Epoch 36/40\n",
      "89719/89719 [==============================] - 108s 1ms/step - loss: 0.3332 - acc: 0.9062 - val_loss: 2.2321 - val_acc: 0.6948\n",
      "Epoch 37/40\n",
      "89719/89719 [==============================] - 105s 1ms/step - loss: 0.3177 - acc: 0.9101 - val_loss: 2.2601 - val_acc: 0.7018\n",
      "Epoch 38/40\n",
      "89719/89719 [==============================] - 105s 1ms/step - loss: 0.3126 - acc: 0.9110 - val_loss: 2.2402 - val_acc: 0.7107\n"
     ]
    }
   ],
   "source": [
    "model,history=network(X_train,y_train,X_test,y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 69.27%\n",
      "<keras.callbacks.History object at 0x17582fd30>\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEWCAYAAABliCz2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8XXWd//HX52bfkybplnRJW2gpBQqEssoqCMimooAwIjKijoiOMz+3x/x+zrjMjL+fOG6MY2WRRVFkUURUGEZEQFrSUpa2lG60TUibpc2+535/f3xP2rRN0jTNyb259/18PM7jnnvuufd8eiCf8z3f7ZhzDhERSXyRWAcgIiITQwlfRCRJKOGLiCQJJXwRkSShhC8ikiSU8EVEkoQSviQdM5trZs7MUkex70fN7PmJiEskbEr4EtfM7G0z6zGzkgO2rwmS9tzYRDY0M3vWzP421nGIDEUJXyaDrcB1A2/M7DggK3bhiExOSvgyGdwPfGTQ+xuB+wbvYGYFZnafmdWb2TYz+ycziwSfpZjZt82swcy2AO8d4rt3mVmtmdWY2TfMLGW8/xFmdoWZrTWzpuBO4JhBn30xOHarmW0wswuC7cvMrMrMWsxsl5l9Z7zjkuShhC+TwUtAvpkdEyTia4AHDtjnB0ABMA84B3+BuCn47OPAZcCJQCVw9QHfvRfoAxYE+1wEjGu1jJkdDTwIfA4oBZ4Efmtm6Wa2ELgVOMU5lwe8B3g7+Or3gO855/KB+cBD4xmXJBclfJksBkr5FwJvAjUDHwy6CHzZOdfqnHsbuB34m2CXDwHfdc7tcM7tBv5t0HenAZcAn3POtTvn6oD/AK4d5/ivAX7nnHvaOdcLfBtfLXUG0A9kAIvNLM0597ZzbnPwvV5ggZmVOOfanHMvjXNckkSU8GWyuB/4MPBRDqjOAUqAdGDboG3bgLJgfSaw44DPBswB0oDaoKqlCfgxMPXAAMzsK2bWFiz/dZjxzxx8XOdcNIipzDm3CV/y/2egzsx+YWYzg11vBo4G3jSzl83sssM8rsheSvgyKTjntuEbby8FHj3g4wZ8SXjOoG2z2XcXUAvMOuCzATuAbqDEOVcYLPnOuWOHiOFfnXO5wfLJw/wnvDM4PjOzIKaa4Ld/7pw7K9jHAd8Ktm90zl2HvwB9C3jYzHIO89gigBK+TC43A+c759oHb3TO9ePrtr9pZnlmNgf4PPvq+R8CbjOzcjMrAr406Lu1wFPA7WaWb2YRM5tvZuccQZypZpY5aEkLYnivmV0QvP8H/IXmRTNbaGbnm1kG0AV04qt5MLMbzKw0uCNoCn6//whikySmhC+ThnNus3OuapiPPwO0A1uA54GfA3cHn/0E+CPwKrCag+8QPoKvEloH7AEeBmYcQag/wiftgeUe59wG4AZ843IDcDlwuXOuB19//+/B9p340vxXgt+6GFhrZm34BtxrnXNdRxCbJDHTA1BERJKDSvgiIklCCV9EJEko4YuIJAklfBGRJHHI6WEnUklJiZs7d26swxARmTRWrVrV4JwrHc2+oSZ8M/t7/JwkDngduGmkLmVz586lqmq4XnciInIgM9t26L280Kp0zKwMuA2odM4tAVIY//lJRERklMKuw08FsoInC2Xjh5eLiEgMhJbwnXM1+BkBt+PnMml2zj0V1vFERGRkodXhB3OWXAlU4OcA+ZWZ3eCce+CA/W4BbgGYPXv2Qb8jIpIsent7qa6upqvr4KbOzMxMysvLSUtLG/Pvh9lo+25gq3OuHsDMHsXP/b1fwnfOLQeWA1RWVmqeBxFJWtXV1eTl5TF37lz8hKqec47Gxkaqq6upqKgY8++HWYe/HTjNzLKDqWAvANaHeDwRkUmtq6uL4uLi/ZI9gJlRXFw8ZMn/cIRZh78CP+vganyXzAhBSV5ERIZ2YLI/1PbDEWovHefcV51zi5xzS5xzf+Oc6x7vY/RHHT/8n40891b9eP+0iEhCmfRTK6REjB8/t4X/Xr8r1qGIiMS1SZ/wAcoKs6jZ0xnrMEREjthwzygZj2eXJETCLy/KpqZJCV9EJrfMzEwaGxsPSu4DvXQyMzOP6PfjavK0sSovymLFlsZYhyEickTKy8uprq6mvv7gNsmBfvhHIiESfllhFq3dfTR39lKQNfZBCSIisZSWlnZE/ewPJSGqdMqKsgBUjy8iMoLESPiFPuFX7+mIcSQiIvErMRL+QAlfDbciIsNKiIRfnJNOZlpEVToiIiNIiIRvZswszFIJX0RkBAmR8CEYfKWELyIyrIRJ+OVFGm0rIjKSBEr42TS299DZ0x/rUERE4lLCJPyBrpmq1hERGVriJHx1zRQRGVHiJHwNvhIRGVHCJPxp+ZmkRkwNtyIiw0iYhJ8SMaYXZKpKR0RkGKElfDNbaGZrBi0tZva5sI4HehCKiMhIQpse2Tm3AVgKYGYpQA3wWFjHA99w+9fNmhdfRGQoE1WlcwGw2Tm3LcyDlBdmsauli97+aJiHERGZlCYq4V8LPDjUB2Z2i5lVmVnVUE95ORzlRdlEHexs7jqi3xERSUShJ3wzSweuAH411OfOueXOuUrnXGVpaekRHWugL3616vFFRA4yESX8S4DVzrldYR9Io21FRIY3EQn/OoapzhlvMwr9E93VU0dE5GChJnwzywYuBB4N8zgDMlJTmJqXodG2IiJDCK1bJoBzrgMoDvMYByor0rz4IiJDSZiRtgP0IBQRkaElXsIvyqK2qYto1MU6FBGRuJJwCb+8MIue/ij1bd2xDkVEJK4kXMJXX3wRkaElXMIvL8oG1BdfRORACZfw9w6+UglfRGQ/kz/h93XDbz8LbzwCQE5GKoXZadQ0qS++iMhgkz/hp2bAW0/Bht/v3VRWmKU6fBGRA0z+hA9QXgnVL+99qwehiIgcLEES/imw521o89MrD4y2dU598UVEBiRGwp+1zL8Gpfyywiw6evpp6uiNYVAiIvElMRL+jBMgkro34ZcXaZpkEZEDJUbCT8uC6ccNKuH7vvhquBUR2ScxEj5A+TKoWQ39fXtH26qELyKyTwIl/FOgtx3q11OUnUZ2eop66oiIDJJACb/Sv+5YiZkF0yRr8JWIyIDESfhFcyG7BKqrAN81U3X4IiL7hP2Iw0Ize9jM3jSz9WZ2eogH890zB3XNVB2+iMg+YZfwvwf8wTm3CDgBWB/q0coroXEjdOymrCiLpo5e2rv7Qj2kiMhkEVrCN7N84GzgLgDnXI9zrims4wG+4RagZtW+WTNVyhcRAcIt4c8D6oF7zOwVM7vTzHIO3MnMbjGzKjOrqq+vP7IjzjwJLALVL+8bfKV6fBERINyEnwqcBPzIOXci0A586cCdnHPLnXOVzrnK0tLSIztiRi5MPRZ2rNw3+EolfBERINyEXw1UO+dWBO8fxl8AwlVeCTWrmJqbRlqKqYQvIhIILeE753YCO8xsYbDpAmBdWMfba9Yy6G4h0riRmeqpIyKyV2rIv/8Z4Gdmlg5sAW4K+Xj7Gm6rV1JWeDQ1ezT4SkQEQk74zrk1QGWYxzjIlPmQWQjVL1NWeAJ/fusIG4JFRBJE4oy0HRCJ+FJ+dRVlRVnUtXbT3dcf66hERGIu8RI++IRft545OX7QVW1TV4wDEhGJvQRN+JWA4+j+jYAGX4mIQKIm/LKT/UvbG4AGX4mIQKIm/KxCKF1EfsMrmGnwlYgIJGrCByivJFJTxbTcDJXwRURI6IR/CnTuoTJ/jx6EIiJCQif8ZQCclr5ZjbYiIiRywi9dCOl5HBt9i9qmLvqjLtYRiYjEVOIm/EgKlJ3EnM619EUdu1rUF19EklviJnyAWcsoat1IFl2q1hGRpJfYCb/8FMz1c7xtVU8dEUl6iZ3wy/y8bSdGNqqELyJJL7ETfk4xTJnPqWmbqVYJX0SSXGInfIDyU1hqG6ne3R7rSEREYioJEn4lRa6JxppNOKeumSKSvJIg4fsnYC3oXs+murYYByMiEjuJn/CnLSGamsmJkY2s2Lo71tGIiMRMqAnfzN42s9fNbI2ZVYV5rGGlpGLllZyb+gYrtjTGJAQRkXgwESX885xzS51zE/ts20HshA9TQQ39W/6senwRSVqJX6UDsOT9dKUVckX379i+WzNnikhyCjvhO+ApM1tlZrcMtYOZ3WJmVWZWVV9fH04UaVl0LLmeCyNVvL72jXCOISIS58JO+Gc6504CLgE+bWZnH7iDc265c67SOVdZWloaWiBF53wSzMh67d7QjiEiEs9CTfjOuXeC1zrgMWBZmMcbiRXO5rWcMzi54XHo1ahbEUk+oSV8M8sxs7yBdeAiIKb1KbULb6SQVppe/kUswxARiYkwS/jTgOfN7FVgJfA759wfQjzeIc0+6SI2RMthxXJQbx0RSTKhJXzn3Bbn3AnBcqxz7pthHWu0jplZwC/tYgqb10H1y7EOR0RkQiVHt8xASsSomX0FbeTAih/HOhwRkQmVVAkf4IT5Zfyy72zcul9D685YhyMiMmGSLuGfWjGF+/vfjUX7YNVPYx2OiMiESbqEf1xZITtTy9iYfzpU3Q19PbEOSURkQiRdwk9PjXDS7CIeiF4Ebbtg/eOxDklEZEIkXcIHWFYxhfsbjyJaWAErfxLrcEREJkTSJvyoi7C54jrY8RLUvhrrkEREQpeUCf/EWUWkpRhPRM6HtGxYuTzWIYmIhC4pE35WegrHlxfylx09cPw18PrD0KGnYYlIYkvKhA++Wue16mY6T7wZ+rpg9X2xDklEJFRJnfD7oo7VXTNg7rvg5TuhvzfWYYmIhGZUCd/M5ptZRrB+rpndZmaF4YYWrpPnFBEx/IPNT78VmnfAa7+MdVgiIqEZbQn/EaDfzBYAdwEVwM9Di2oC5GemsXhmPiu3NsLR74EZJ8Bz34b+vliHJiISitEm/Khzrg94H/Bd59zfAzPCC2tinFpRzCvbm+juj8I5X4I9W1XKF5GENdqE32tm1wE3Ak8E29LCCWniLKuYQndflNerm2HhJTD9eHju/6mULyIJabQJ/ybgdOCbzrmtZlYBPBBeWBPjlLlTgKAe3wzODUr5r/8qxpGJiIy/USV859w659xtzrkHzawIyHPO/XvIsYVuSk46R0/LZeXWoA/+wkth+nHw3P9VKV9EEs5oe+k8a2b5ZjYFeBW4x8y+M8rvppjZK2b2xKH3nnjLKqawatse+vqjvpR/zpdg9xZ44+FYhyYiMq5GW6VT4JxrAd4P3OOcOxl49yi/+1lg/ViCmwjLKopp6+5jfW2r37DovTDtONXli0jCGW3CTzWzGcCH2Ndoe0hmVg68F7hzDLFNiGV76/Eb/QYzOOcL0LgJ3ngkhpGJiIyv0Sb8rwF/BDY75142s3nAxlF877vAF4DocDuY2S1mVmVmVfX19aMMZ/xML8hkTnG2b7gdsOgymLbE1+VH+yc8JhGRMIy20fZXzrnjnXOfCt5vcc59YKTvmNllQJ1zbtUhfnu5c67SOVdZWlo66sDH07K5U1i5dbevxweIRFTKF5GEM9pG23Ize8zM6sxsl5k9ElTXjORM4Aozexv4BXC+mcVlV86Ljp1Oc2cvz7xZt2/josth6rHwZ5XyRSQxjLZK5x7gcWAmUAb8Ntg2LOfcl51z5c65ucC1wP845244glhDc97CUqbnZ/KzFdv3bdxbyt8Iax+LXXAiIuNktAm/1Dl3j3OuL1h+CsSm/iUEqSkRrl02i+feqmd7Y8e+D465AqYuhj9/S6V8EZn0RpvwG8zshqBPfYqZ3QA0jvYgzrlnnXOXjS3EiXHtKbNJiRgPvjxEKb/hLZXyRWTSG23C/xi+S+ZOoBa4Gj/dQsKYXpDJ+Yum8quqHfT0DepUdMyVUHqM6vJFZNIbbS+d7c65K5xzpc65qc65q/CDsBLK9afOpqGth6fW7dy3MRLxc+w0bICHPwa9nbELUETkCBzJE68+P25RxImzjyqlvCiLn720ff8PFl8JF30T1v0G7r0c2iZ+vICIyJE6koRv4xZFnIhEjOuWzeavWxrZXN+27wMzOONWuOZ+2PkG3HkB1G+IXaAiImNwJAnfjVsUceRDlbNIjRgPrth+8IfHXA43/c5X69x5IWx5dsLjExEZqxETvpm1mlnLEEsrvk9+winNy+A9x07n4dXVdPUO0UhbdjJ8/BnInwkPfABW3z/xQYqIjMGICd85l+ecyx9iyXPOpU5UkBPt+lNn09TRy+/fqB16h8LZcPMfoeJsePxWeOZrEB12uiARkbhwJFU6Cev0+cVUlOQc3Hg7WGYBfPghOPmj8Jfb4ZGbobdrwmIUETlcSvhDMDM+vGw2Vdv2sGFn6/A7pqTBZd+FC78Oax+F+98HnXsmLlARkcOghD+MD5xcTnpKhJ+v2DbyjmZw5m1w9T1QUwV3XwLNNRMTpIjIYVDCH8aUnHQuPW46j66uoaNnFE++WvJ+uP5haK6Guy6EujfDD1JE5DAo4Y/g+tPm0NrdxxOvDtN4e6B558BNT0K0D+5+D2x/KdwARUQOgxL+CCrnFHHU1Fx+dqhqncFmHA83PwXZxXDflfDm78ILUETkMCjhj8DMuP7U2bxa3cwbNc2j/2LRXJ/0px0Lv7wBqkZ8dICIyIRQwj+E951UTmZaZP+Ho4xGTgnc+FuYfwE88Tl49t/BJeTgZBGZJJTwD6EgK43Lj5/Jb9bU0NLVe3hfTs+B6x6EpdfDs/8Gj94CXYdxpyAiMo6U8EfhxjPm0tnbz388/dbhfzklDa68A879in8g+n+eAVv+PP5BiogcghL+KCwpK+CGU+fw0xff5pXtYxhYZQbnftHX66dlwn1XwJNfgJ6OQ39XRGSchJbwzSzTzFaa2atmttbM/iWsY02EL1y8kGl5mXz50dfp7R/jvDnllfCJv8Cpn4SVP4Yfvwuqq8Y3UBGRYYRZwu8GznfOnQAsBS42s9NCPF6o8jLT+PpVS3hzZyvLn9sy9h9Kz4ZLvgUfeRz6uv0grWe+Dn094xesiMgQQkv4zht4ikhasEzqbioXLp7GpcdN53vPbGTL4AekjMW8c+BTL8AJH4a/fBvuPN8/XEVEJCSh1uGbWYqZrQHqgKedcyuG2OcWM6sys6r6+vh/dOA/X3EsmakRvvzo60SjR3j9yiyAq+6Aax+E1p2+iueRj0PDxvEJVkRkkFATvnOu3zm3FCgHlpnZkiH2We6cq3TOVZaWloYZzriYmpfJVy49hhVbd/PLqh3j86OLLoVPr4QzPgNvPgF3LPNdOBs2jc/vi4gwQb10nHNNwLPAxRNxvLBdc8osTps3hX99cj11LeM0B372FLjwa/DZ1+D0W2H9b+GOU+DRTyjxi8i4CLOXTqmZFQbrWcC7gYSYQtLM+Lf3H093X5SvPr52fH88txQu+nqQ+D8N637jE/9jn4T6tzRaV0TGLMzHFM4A7jWzFPyF5SHn3BMhHm9CVZTk8NkLjuL//XEDf1y7k/ccO318D5BbChd9A864DV78Pqy8E1590Nf7lxwdLEftWy+a6wd5iYgMw1wclRgrKytdVdXk6Zfe2x/l8h88z56OHp7+/DnkZ4aYcNvqfGm//k1oeMs37LYOmrY5kgZT5vm+/rNPhzln+Pdm4cUkIjFnZqucc5Wj2lcJ/8is2dHE+//zBT586my+cdVxE3vwrhaf+Bve8kvdetixAjp3+89zpsLs03zyn306TD8OIikTG6OIhOpwEn6YVTpJYemsQj56RgV3v7CV9x43k9PnF0/cwTPzofxkvwxwzif/bS/C9r/6Zf3j/rP0PDj+g3DulyF36sTFKSJxQSX8cdDe3cflP3ie3R09PPKpM5hfmhvrkPbXXOMT/+Y/wWu/gNRMOPNzvlE4PTvW0YnIETicEr4mTxsHORmp3HPTKaSY8dF7VlLf2h3rkPZXUAbHXe0HeX16Jcw/D/70DfjByfDKzyDaH+sIRWQCKOGPkznFOdx5YyX1rd387b0vj+7B57FQPB+ueQBu+gPkz4Df/B0sP8eX/kUkoSnhj6MTZxfx/WtP5LWaZm57cA39Rzr1QpjmnA5/+wxcfbd/KMv9V8EDV8OGP/j6/3degfoN0LQd2hugpx2iY5wlVETigurwQ3Dvi2/z1cfX8pHT5/AvVxyLxXvXyL5uWPFjeO7b0H2IJ3Jl5EPxgn3jAEoXBuMAKiA1fWLiFZG91Esnxm48Yy41TZ0sf24L5UVZ3HL2/FiHNLLUDDjzNjjpI75U39cJvZ3Q2xG8DlrvaPS9gN7+i28AHmApMKUCShfB4qvgmMv9w14OR3sjrH0UWmogJcPHNbCkZPjG5tR0KJwDM5eO7zkQSQJK+CH50sWLqNnTyb8++SYzC7O47PiZsQ7p0LIKYfapo9+/uxUaN/kpHwbGAtSs9hPAZRbC8R/yF5HpI4xP6O+FjU/Bmp/DW3+EaC9EUiF6iDaQinN899I5p48+XpEkpyqdEHX19nPDnSt4rbqZB/72VJZVTIl1SOGLRuHt52D1fX4CuP4emLHUJ/7jrvZTQzgHta/6qSJe/5W/a8iZ6i8QJ1wH05f43+nv9tVNfd2D1rv8M4Ff+C601weJ/0t+cJlMrNpXIbsYCspjHUlS00jbOLKnvYcP/NeLNLb5PvoLpsZZH/0wdeyG1x6CV+6HXW9AahYsvMRXG9WthZR0WHgpLP0wzL8AUg7jhrOnA6runpyJ3zlfbZUzdXK2e7TVw9P/B179uW/TueL7cOz7xv84Hbth9b2QNxNmneLbieK9PSwGlPDjzPbGDt7/oxcA+MlHKjlxdlGMI5pgzvleP6/cD2sfgynzfZJf8n7IOsJz0dMBq+6B578L7XVQcTac9XmYcYL/7dEmCOd8b6TGjbB7CxTMgjlnHt5FaKTfrn8T3n7et328/by/q7EU3wA+dRGUHuNfpy72cyDF40R40X5/rp/5mj/vp30Stv0VaqrglI/De77p21vGw5tPwm8/6/+bDsgugVnLoPwU/zrzpLEPHOzYDet+Da8/7J80lz8TCmf5/+6Fs/164Rz/PndqXF9olPDj0Ka6Nj7205fZ1dLFd69ZyiXHzYh1SInlwMQPkJ7r/3gLZg36Y54FeTOgbZd/zkDjRt8O0bjJd08dLLsEjrkMFl8Jc88effKP9vu7mG0v7J/gAfLLoeJdPlm17YS6N6F+Pezeyt4ngEbSfM+nRe+FZR+Pj2kwalbB7/7BX7grzoZLb4fSo/2zmJ/5F/jrD/1F9oM/9Ressepsgj982d89TFsCV97h23SqV8KOl/1rY/B8CEvx1X9lJ/tqwxkn+AvmcHdN3W2w4fe+GnHzM76dqGQhzD3TT07YtA2adkBX0/7fS82CkgW+Q0LJQt8zrXSR76Qw1IXZOehu8XdC7XX+DhR8dWZmYfAaLOMwt5USfpxqbOvm4/dVsXp7E1++ZBG3nD0v/rtsTjY9Hf6Pec82aN7h/4Cbtw/9hwyQX+ZL2cULfDfT4gU+Ye1a60uAG/4Ave2QNcUn4GOv8tVHKWm+naF5u5+0rm69L8XXrfeN133Bg3EKZsHcs/YthXOGLi32dPjvDfxG7RrfVpGSDidc4x+KU7ow3HM3lM49vkRfdQ/kTvOl+CUfOPjf8Obv4Nef8snuyh/6i+Th2vQMPP4Z/7jPs/4ezvni0Mm7vRGqg+S/Y6VvS+hu8Z9F0mDaYn8BmBlcBNrqfZLf8KTvbZZfDsd9AI77oL+oHPhv6WrZ9/9O03Z/Iajf4Jfm7fv2i6QF/98s8J0P2oLk3l6/77//oWTk+4tAQTl87PeHf85Qwo9rXb39/OOvXuWJ12q5btksvnblEtJSNP5tQnS1QHM1tL7j68+L50N6zsjf6e30iWgg+fe0+j/Qork+Qfd27Ns3v8yX/KYeA9OO9e0JwyX40WjYBC/d4Xsw9XXBUe+BM26Fue8a+jfbG331yo6VPiE2V/ueV1lFQy8Z+f53XDRY3L51HLTugr/c7pP+qZ/wvaIy84ePd882ePgmfzew7BP+QT6jqeLpboOn/7dvkyk5Gq76r/0nBDyUaBT2bPWJv3YNvLPGrw++wGcV+XaG4z4Is06DyBj/5rrb9vVIq3/TXwQaNvouw7ml/v+rva9TIac0uEMzfwfZ1RS8Nvu7mYH1lFS44gdjCkkJP85Fo47bn97AHX/azLuOKuGO608Kdy59GR+9XbD5f/xzCdrrfHIfSPClC/0tehjaG+Dlu2Dlcuho8KXW0z/jj1m9EqqDJL97s99/oKpjyjx/kevcs2/pamZv1dFozDoV3nv7yF1rB9uvimcpvPc7kF3k71RS0v2dUUqGX4+k+GqvX/+dL0mf/mk4/58gLeuwT9FBnPMl89pXIS3b35VNxgbyUVDCnyQeenkHX3nsdeaV5nD3R0+hvEgzV8oIejvhtV/CX+/wJcwBOVODxsxKKF/mqzKGu3OJ9gelyz372iwscsBi/jWS6nvGjKU0PFDFc2C7yH4McP4YV/1IYyrGKC4SvpnNAu4DpgNRYLlz7nsjfSfZEj7AC5sa+OQDq8hITeHOGytZOqsw1iFJvItG/Z1GV5NP8kdSbRSmllpfgu/v9eMx+nsGrQevGXlwys2HrlqTYcVLwp8BzHDOrTazPGAVcJVzbt1w30nGhA+wqa6Vj97zMnUt3Xzh4oV87MwKIpE4/AMWkbgTF/PhO+dqnXOrg/VWYD1QFtbxJrMFU/N4/NazOPvoEr7xu/V89KcvU9c6ylZ+EZFRmpDuIWY2FzgRWDHEZ7eYWZWZVdXX109EOHFpSk46P/lIJV+/agkrtjRyyXf/wjPrd8U6LBFJIKEnfDPLBR4BPuecaznwc+fccudcpXOusrS0NOxw4pqZ8TenzeGJz5zF1PxMbr63iv/zmzfo6tUTqUTkyIWa8M0sDZ/sf+acezTMYyWSo6bl8etPn8HNZ1Vw31+3ccUPn2d97UHXShGRwxJawjc/hPQuYL1z7jthHSdRZaSm8L8vW8y9H1vG7vZerrzjBe56fmt8P0VLROJamCX8M4G/Ac43szXBcmmIx0tI5xxdyh8/9y7etaCErz+xjit++Dwrt+6OdVgiMglp4NUk4Zzjiddq+bcn1/NOcxeXnzCTL1+yiJmF4zAqUUSbR/aqAAAPqklEQVQmrbjolinjy8y4/ISZPPMP53LbBUfx1NqdnH/7s3zvvzeqUVdERkUJf5LJSk/h8xcezTP/cA4XLJrGf/z3W1xw+5958vVa4uluTUTijxL+JFVelM0d15/EL245jfysNP7uZ6u57icvsWrbnliHJiJxSgl/kjttXjFPfOYsvvm+Jby1q40P/OhFrlv+Ei9ualCJX0T2o0bbBNLR08fPV2xn+XNbqGvt5sTZhdx63gLOXzRVD1oRSVBxMXnaWCjhj4+u3n4eXlXNj57dTE1TJ4tn5PPp8xZw8ZLppGhSNpGEooQvAPT2R/nNmnf4zz9tYktDO/NKc/jk2fO5YulMMtOO/FmaIhJ7Sviyn/6o4/dv1HLHnzazvraFktx0bjhtDjecNoeS3FE8gk5E4pYSvgzJOceLmxu58y9b+NOGetJTI7xvaRkfO6uChdPzYh2eiIzB4ST81LCDkfhhZpy5oIQzF5Swqa6Ne17YyiOrq/ll1Q7edVQJN59VwTlHl6qBVyRBqYSf5Pa09/Dzldu598W3qWvtpqIkh6uWlnHViTOZU6zHzonEO1XpyGHr6YvyxGvv8Kuqal7a2ohzcNLsQt53YhnvPX4mU3LSYx2iiAxBCV+OyDtNnTz+6js8trqGDbtaSY0Y5xxdylUnlvHuY6aRla4ePiLxQglfxs362hZ+/UoNv1nzDjtbushOT+HchaVctHg65y2aSkFWWqxDFElqSvgy7vqjjhVbG3nitVqeXreL+tZuUiPG6fOLuWjxNN69eBozCjRVs8hEU8KXUEWjjjXVTTy1dhdPrd3JloZ2AE4oL+DCxdM4b9FUFs/IV28fkQmghC8TalNdG0+t28lTa3exZkcTANPyMzjn6FLOWziVM48qIT9TVT8iYVDCl5ipa+ni2bfq+fOGep7bWE9rVx+pEeOkOUWct3Aq5y4sZdH0PJX+RcZJXCR8M7sbuAyoc84tGc13lPATS19/lNXbm3h2Qx3PbqhnXW0LAMU56SyrmMKpFVM4dV4xC6flEdGkbiJjEi8J/2ygDbhPCV8AdrV08ee36nlpcyMrtu6mpqkTgMLsNE6Z6y8Ap80r5pgZ+ZrVU2SU4mJqBefcc2Y2N6zfl8lnWn4mH6qcxYcqZwGwY3cHK7buZsUWfwF4et0uAHIzUjlhVgEnzS7ipNlFnDi7kMJsDfwSOVIxn0vHzG4BbgGYPXt2jKORiTRrSjazpmRz9cnlANQ2d7Jiy26qtu1m9bYm7vjTJqLBDei80py9yf/EWUUcPS2X1BQ9sE3kcITaaBuU8J9QlY6MRXt3H69VN7N6+x5e2b6H1dub2N3eA0BGaoTFM/M5vqyAJWUFHF9eyPzSHF0EJOnERZWOyJHKyUjl9PnFnD6/GPDTO29r7GDNjiZer2nm9ZpmHl5Vzb1/3QZAZlqEY2cWcFxZAYtn5rN4Rj5HTcslI1VTQYiAEr5MImbG3JIc5pbkcNWJZYAfBLaloZ03app5rbqZN2qaeahqBx09/QCkRowFU3NZPCOfY2bks3imf9VkcJKMwuyl8yBwLlAC7AK+6py7a6TvqEpHxkM06ti2u4N177SwrraZde+0sL62lZ0tXXv3KclNZ15pLvNLc1kwNZf5pTnML82lrDBLXURlUomLbpljoYQvYWps62Z9bSvrapvZXNfOpvo2NtW10dzZu3efzLQIFSW5zCvNYX5JDhWlOXvfa7SwxCPV4YsMoTg3g7OOyuCso0r2bnPOsbu9h8317Wyub2NzXRub6tt4o6aZ379eu7eXEPi7goqSHOaV5DKnJJtZRdmUF2Uxa0o2xTnpGj0scU8JX5KamVGcm0FxbgbLKqbs91l3Xz87dnewpb6drQ3te1+feXMXDW09++2blZZCeVHW3gtAeVFWcEHIZtaULAqy0nRBkJhTwhcZRkZqCgum5rFg6sEPeG/r7qNmTyc7dndQvaeDHXs6/evuTqq27aG1q2+//fMyUik74GIwoyCT6QWZzCjIoiQ3XV1KJXRK+CJjkJuRysLpeSycfvDFAKC5s3fvBaB6TwfVwcVhe2MHL2xq2NuLaEDEYGqevwBMzw9eCzKZlp/BtHy/bVp+JjkZ+pOVsdP/PSIhKMhKoyCrgGNnFhz0mXOOPR291DZ3squli9rmLnYOLC1dbKpv4/lNDbR19x303byMVKYFF4KpeZmU5KZTmpdBSe6+pTQvgyk56ZqPSA6ihC8ywcyMKTnpTMlJH/KCMKCtu49dLV3sCi4EO1u6qGvp3nthWNmwm4a2brr7ogd9N2IwJSed4hyf/Itz0ynJ3bdenJOxd1tJbjq5GalqY0gCSvgicSo3I5XcYKzAcJxztHb30dDaTUNbDw1t3X5p7aa+rYfd7d3sbu9h3TstNLR109J18F0D+KkqSnIzKMnLoHTvhcBfFIpzMygedKEoyk5Te8MkpYQvMomZGfmZaeRnpjGv9ND79/RF2dPhLwyNgy8QbT3BRaKbmqYuXq1uZnd7D/3Rg8fpmEFhVhrFuRnkZ6aSk5FKTnoq2Rkp5KQPvE8hOyOVvIxU8rPSyM9KDaq5/KI7ithQwhdJIumpEaYFDcCHEo06mjt7aWz3F4TG4I6hoa3Hb2vtobW7l9YuX/XU3t1PR08f7T399AxRzTRYxCA/SP75mf6CMHDh2ruelUZeZip5mQOvqeRl+PXczFTSdJdx2JTwRWRIkYhRlJNOUU46C6Ye3nd7+6N0dPfT2t1Lc6dfWjr3rfv3ff61y39W19IdrPfR2dt/yGNkpkUGXQzSyM9MJTcj9YCLRBo56SlkpqWQkRrxr2kRMlJTyAxes9JTyEpLITvd75PIdx5K+CIy7tJSIhRkRyjITqO86PC/39MXpbXLXxjauvto7RpY9r33r720DPpsZ3PX3vX2nkNfNA4UMT+ILis9lex0fxHISh+oqkrZV3U1UI2VHqxnpJKbkUJ2ur/o+G0p5GakkpWWEjcXESV8EYk76amRvSOgx6o/6mjr6qOjt4+u3ijdff109Ubp6u2nu8+/dvX2090bpaOnj47efjp7+ukIls6gespv66O+tZv2nj46evpp7+4bsnfUUMx8o3hqJEJKxEiNGKkptt/7krwMHvrE6WP+t46WEr6IJKSUiFGQnUYB4Ux619cfpaPXJ//27j7auvvp6PZ3Hu09/v3AZz19Ufqijr5+/9ofdXtfe/uj5E7QgDolfBGRMUhNiZCfEplUs6iqmVtEJEko4YuIJAklfBGRJBFqwjezi81sg5ltMrMvhXksEREZWWgJ38xSgDuAS4DFwHVmtjis44mIyMjCLOEvAzY557Y453qAXwBXhng8EREZQZgJvwzYMeh9dbBtP2Z2i5lVmVlVfX19iOGIiCS3MBP+UGOJD5p6zzm33DlX6ZyrLC0dxXR/IiIyJmEOvKoGZg16Xw68M9IXVq1a1WBm28Z4vBKgYYzfnSiKcXwoxvExGWKEyRFnLGOcM9odzbmD57seD2aWCrwFXADUAC8DH3bOrQ3peFXOucowfnu8KMbxoRjHx2SIESZHnJMhRgixhO+c6zOzW4E/AinA3WElexERObRQ59Jxzj0JPBnmMUREZHQSaaTt8lgHMAqKcXwoxvExGWKEyRHnZIgxvDp8ERGJL4lUwhcRkREo4YuIJIlJn/AnywRtZva2mb1uZmvMrCrW8QCY2d1mVmdmbwzaNsXMnjazjcHrGJ5IGnqM/2xmNcG5XGNml8Y4xllm9iczW29ma83ss8H2uDmXI8QYN+fSzDLNbKWZvRrE+C/B9gozWxGcx1+aWXocxvhTM9s66DwujVWMI3LOTdoF391zMzAPSAdeBRbHOq5hYn0bKIl1HAfEdDZwEvDGoG3/F/hSsP4l4FtxGOM/A/8Y6/M3KJ4ZwEnBeh5+/MnieDqXI8QYN+cSPzo/N1hPA1YApwEPAdcG2/8L+FQcxvhT4OpYn8NDLZO9hK8J2o6Ac+45YPcBm68E7g3W7wWumtCgDjBMjHHFOVfrnFsdrLcC6/HzRsXNuRwhxrjhvLbgbVqwOOB84OFge6zP43AxTgqTPeGPaoK2OOGAp8xslZndEutgRjDNOVcLPkkAU2Mcz3BuNbPXgiqfmFY7DWZmc4ET8SW/uDyXB8QIcXQuzSzFzNYAdcDT+Dv4JudcX7BLzP/GD4zROTdwHr8ZnMf/MLOMGIY4rMme8Ec1QVucONM5dxL++QCfNrOzYx3QJPYjYD6wFKgFbo9tOJ6Z5QKPAJ9zzrXEOp6hDBFjXJ1L51y/c24pfu6tZcAxQ+02sVEdcPADYjSzJcCXgUXAKcAU4IsxDHFYkz3hH/YEbbHinHsneK0DHsP/zxyPdpnZDIDgtS7G8RzEObcr+KOLAj8hDs6lmaXhE+nPnHOPBpvj6lwOFWM8nksA51wT8Cy+frwwmJsL4uhvfFCMFwdVZs451w3cQ5ycxwNN9oT/MnBU0IqfDlwLPB7jmA5iZjlmljewDlwEvDHyt2LmceDGYP1G4DcxjGVIA0k08D5ifC7NzIC7gPXOue8M+ihuzuVwMcbTuTSzUjMrDNazgHfj2xr+BFwd7Bbr8zhUjG8OurAbvo0hLv++J/1I26Ab2XfZN0HbN2Mc0kHMbB6+VA9+/qKfx0OcZvYgcC5+atddwFeBX+N7RcwGtgMfdM7FrNF0mBjPxVdBOHzvp08M1JXHgpmdBfwFeB2IBpu/gq8jj4tzOUKM1xEn59LMjsc3yqbgC6MPOee+Fvz9/AJfVfIKcENQko6nGP8HKMVXM68BPjmocTduTPqELyIiozPZq3RERGSUlPBFRJKEEr6ISJJQwhcRSRJK+CIiSUIJX5KKmfUPmtFwzXjOsGpmcwfP6ikSb0J9pq1IHOoMhsWLJB2V8EXY+7yCbwVzna80swXB9jlm9kwwKdYzZjY72D7NzB4L5kV/1czOCH4qxcx+EsyV/lQwGlMkLijhS7LJOqBK55pBn7U455YBP8SP3iZYv885dzzwM+D7wfbvA392zp2An69/bbD9KOAO59yxQBPwgZD/PSKjppG2klTMrM05lzvE9reB851zW4JJxnY654rNrAGY4ZzrDbbXOudKzKweKB88xD+Ydvhp59xRwfsvAmnOuW+E/y8TOTSV8EX2ccOsD7fPUAbP8dKP2skkjijhi+xzzaDXvwbrL+JnYQW4Hng+WH8G+BTsfSBG/kQFKTJWKn1IsskKnlY04A/OuYGumRlmtgJfELou2HYbcLeZ/S+gHrgp2P5ZYLmZ3YwvyX8K/wARkbilOnwR9tbhVzrnGmIdi0hYVKUjIpIkVMIXEUkSKuGLiCQJJXwRkSShhC8ikiSU8EVEkoQSvohIkvj/eTzvfPYK66MAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "evaluate_model(history,X_test,y_test,model)\n",
    "y_pred=model.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1190, 9440, 1921, 1423, 9576, 618, 7497, 6446, 2743, 5174, 9560, 1921, 2872, 7265, 3929, 10561, 6658, 8692, 2648]\n",
      "[1190, 3742, 6107, 1423, 9576, 618, 9506, 6446, 2743, 5174, 9560, 1921, 2872, 4611, 3929, 10561, 6658, 8692, 8042]\n"
     ]
    }
   ],
   "source": [
    "#predicted class vs actual, some examples\n",
    "print(list(y_pred.argmax(axis=1)[1:20]))\n",
    "print(list(target_test[1:20]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
